import axios from "axios"

import {
    removeToken,
    getToken
  } from "@/utils/auth";
import { Message, MessageBox } from "element-ui"

// 创建axios实例
const service = axios.create({
	baseURL: process.env.VUE_APP_BASE_API_URL, // api的base_url
	timeout: 600000 // 请求超时时间
})

// request拦截器
service.interceptors.request.use(config => {
	// NProgress.start()
    const token = getToken();
	config.headers["Content-Type"] = "application/json;charset=UTF-8"
	if (token) {
		config.headers.Authorization = "Bearer " + token
	}
	return config
    
}, error => {
	return Promise.reject(error.response)
})

// respone拦截器
service.interceptors.response.use(
	response => {
		/**
		 * code为非20000是抛错 可结合自己业务进行修改
		 */

		// NProgress.done()
		const { status, msg } = response
		// 说明token过期了,获取新的token
		if (status === 401) {
			MessageBox.confirm('你已被登出，可以继续留在该页面，或者重新登录', 'token失效！', {
				confirmButtonText: '重新登录',
				// cancelButtonText: '取消',
				showCancelButton: false,
				type: 'warning'
			}).then(() => {
				// sessionStorage.removeItem("addTab")
                removeToken()
				location.reload() // 为了重新实例化vue-router对象 避免bug
			})
		}
		if (status == 500) {
			Message({
				message: msg,
				type: 'error',
				duration: 5 * 1000
			})
		}
		return response
	},
	(error) => {
		const res = error.response
		if (res.status === 500) {
			Message({
				message: '系统错误，请联系管理员',
				type: 'error',
				duration: 5 * 1000
			})

			return Promise.reject()
		}
		if (res.status === 504) {
			Message({
				message: '连接超时，请联系管理员',
				type: 'error',
				duration: 5 * 1000
			})

			return Promise.reject()
		}
		if (res.status === 401) {
			return MessageBox.confirm('你已被登出，可以继续留在该页面，或者重新登录', '确定登出', {
				confirmButtonText: '重新登录',
				cancelButtonText: '取消',
				showCancelButton: false,
				type: 'warning'
			}).then(() => {
				// sessionStorage.removeItem("addTab")
                removeToken()
				location.reload() // 为了重新实例化vue-router对象 避免bug
			}).catch(() => {
				// console.log(err)
			})
		}
		if (res.status === 403) {
			MessageBox.alert('您没有该权限，请联系管理员')
			return Promise.reject()
		}
		Message.error('数据接口错误，请联系管理员')
		return Promise.reject()
		// return Promise.reject(res)
	}
)

const toDate = date => {
	const newDate = new Date(date)
	return newDate.getFullYear() + '-' +
		(newDate.getMonth() + 1 + '-') +
		newDate.getDate() + ' ' +
		newDate.getHours() + ':' +
		newDate.getMinutes() + ':' +
		newDate.getSeconds()
}

const transformDate = data => {
	if (!data) return
	if (Array.isArray(data)) {
		data.forEach(i => {
			return transformDate(i)
		})
	}
	const toString = Object.prototype.toString
	if (toString.call(data) === '[object Object]') {
		for (const key in data) {
			if (
				toString.call(data[key]) === '[object Date]' ||
				/^\d{4}-[\d]{1,2}-[\d]{1,2}\s+[\d]{1,2}:[\d]{1,2}:[\d]{1,2}$/ig.test(data[key])
			) {
				data[key] = toDate(data[key])
			}

		}
	}
	return data
}

export default function (config) {
	const data = config.data
	const params = config.params
	if (data) {
		transformDate(data)
	}
	if (params) {
		transformDate(params)
	}
	return service(config)
}
